/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package redinftel.formularios;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.TreeSet;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import redinftel.entidades.Amistad;
import redinftel.entidades.Comentariomultimedia;
import redinftel.entidades.Etiquetas;
import redinftel.entidades.Multimedia;
import redinftel.entidades.Publicacion;
import redinftel.entidades.Usuario;
import redinftel.sesiones.ComentariomultimediaFacadeRemote;
import redinftel.sesiones.EtiquetasFacadeRemote;
import redinftel.sesiones.MultimediaFacadeRemote;
import redinftel.sesiones.PublicacionFacadeRemote;
import redinftel.sesiones.UsuarioFacadeRemote;
import redinftel.utilidades.ComparableMultimedia;

/**
 *Clase que me permite subir fotos y videos y archivos multimedia
 * @author Six Degrees Team
 */
@ManagedBean
@RequestScoped
public class MostrarMultimediaBean {
    @EJB
    private PublicacionFacadeRemote publicacionFacade;
    @EJB
    private MultimediaFacadeRemote multimediaFacade;

    @EJB
    private ComentariomultimediaFacadeRemote comentariomultimediaFacade;
    @EJB
    private EtiquetasFacadeRemote etiquetasFacade;
    @EJB
    private UsuarioFacadeRemote usuarioFacade;

    private Usuario usuario;
    private Multimedia multimedia;
    private String elemento;
    private List<ComparableMultimedia> listaComentarios;
    private static int indice = 1;

    public List<ComparableMultimedia> getListaComentarios() {
        return listaComentarios;
    }

    public void setListaComentarios(List<ComparableMultimedia> listaComentarios) {
        this.listaComentarios = listaComentarios;
    }

    /**
     *
     * @return elemento
     */
    public String getElemento() {
        return elemento;
    }

    public void setElemento(String elemento) {
        this.elemento = elemento;
    }

    public Multimedia getMultimedia() {
        return multimedia;
    }

    public void setMultimedia(Multimedia multimedia) {
        this.multimedia = multimedia;
    }

    /** Creates a new instance of MostrarMultimediaBean */
    public MostrarMultimediaBean() {
        FacesContext con = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) con.getExternalContext().getSession(false);
        usuario = (Usuario) session.getAttribute("usuario");
        try{
            int idMultimedia = Integer.parseInt(con.getExternalContext().getRequestParameterMap().get("idMultimedia"));
            multimediaFacade.find(idMultimedia);
            con.getExternalContext().getRequestParameterMap().clear();

        }catch(Exception e){
            multimedia=(Multimedia)(usuario.getMultimediaCollection().toArray()[indice]);
        }

        listaComentarios=new ArrayList<ComparableMultimedia>();
        for(Comentariomultimedia m: multimedia.getComentariomultimediaCollection())
        {
            listaComentarios.add(new ComparableMultimedia(m));
        }
         Collections.sort(listaComentarios);
          if (multimedia.getTipo().contains("youtube")) {
            elemento = "";
            String youtube=new String(multimedia.getImagen());
            youtube=youtube.replace("http://www.youtube.com/watch?v=", "http://www.youtube.com/embed/");
            if(youtube.indexOf("&")!=-1)
            {
               youtube=youtube.substring(0,youtube.indexOf("&"));
            }
            codificado=youtube;
            System.out.println(codificado);
        } else {

            elemento = "data:"+multimedia.getTipo()+";base64, ";
            codificado=Base64.encode(multimedia.getImagen());
        }

        
    }

    public synchronized void mostrar(OutputStream out, Object data) throws IOException {

        out.write(multimedia.getImagen());
        out.flush();
        out.close();



    }

    public String doNext() {
        indice = (indice + 1) % (usuario.getMultimediaCollection().size());
        multimedia = (Multimedia) (usuario.getMultimediaCollection().toArray()[indice]);
        listaComentarios=new ArrayList<ComparableMultimedia>();
        for(Comentariomultimedia m: multimedia.getComentariomultimediaCollection())
        {
            listaComentarios.add(new ComparableMultimedia(m));
        }
        Collections.sort(listaComentarios);
          if (multimedia.getTipo().contains("youtube")) {
            elemento = "";
            String youtube=new String(multimedia.getImagen());
            youtube=youtube.replace("http://www.youtube.com/watch?v=", "http://www.youtube.com/embed/");
            if(youtube.indexOf("&")!=-1)
            {
               youtube=youtube.substring(0,youtube.indexOf("&"));
            }
            codificado=youtube;
            System.out.println(codificado);
        } else {

            elemento = "data:"+multimedia.getTipo()+";base64, ";
            codificado=Base64.encode(multimedia.getImagen());
        }
        return "mostrarMultimedia";
    }

    public String doPrevious() {
        if (indice == 0) {
            indice = usuario.getMultimediaCollection().size() - 1;
        } else {
            indice--;
        }
        multimedia = (Multimedia) (usuario.getMultimediaCollection().toArray()[indice]);
        listaComentarios=new ArrayList<ComparableMultimedia>();
        for(Comentariomultimedia m: multimedia.getComentariomultimediaCollection())
        {
            listaComentarios.add(new ComparableMultimedia(m));
        }
         Collections.sort(listaComentarios);
          if (multimedia.getTipo().contains("youtube")) {
            elemento = "";
            String youtube=new String(multimedia.getImagen());
            youtube=youtube.replace("http://www.youtube.com/watch?v=", "http://www.youtube.com/embed/");
            if(youtube.indexOf("&")!=-1)
            {
               youtube=youtube.substring(0,youtube.indexOf("&"));
            }
            codificado=youtube;
            System.out.println(codificado);
        } else {

            elemento = "data:"+multimedia.getTipo()+";base64, ";
            codificado=Base64.encode(multimedia.getImagen());
        }
        return "mostrarMultimedia";
    }
    /*******************ETIQUETAR******************************/
    private String amigo;

    public String getAmigo() {
        return amigo;
    }

    public void setAmigo(String amigo) {
        this.amigo = amigo;
    }
/**
 *
 * @return me redirige a la pagina mostrar multimedia
 * y me dice los amigos que estan etiquetados
 */
    public String doEtiquetar() {
        Etiquetas et = new Etiquetas();

        try {

            if (!amigo.equals("")){
                Usuario us = usuarioFacade.findByNombreApellidos(amigo).get(0);
                et.setUsuario(us);
                et.setMultimedia(multimedia);
                et.setFecha(new Date());
                et.setIdEtiqueta(etiquetasFacade.findPK());
                multimedia.getEtiquetasCollection().add(et);
                etiquetasFacade.create(et);

                usuario=usuarioFacade.find(usuario.getIdUsuario());
        FacesContext con = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) con.getExternalContext().getSession(false);
        session.setAttribute("usuario", usuario);
            }else{
                amigo="YA ESTABA ETIQUETADO";
            }
            }catch  (NullPointerException e) {
            amigo = "NO ENCONTRADO";
        }
        return "mostrarMultimedia";
    }
/**
 *
 * @return la vista de amigos
 */
   
    /*******************COMENTARIOS**********************************/
    private String nuevoComentario;
    private String codificado;

    public String getCodificado() {
        return codificado;
    }

    public void setCodificado(String codificado) {
        this.codificado = codificado;
    }

    public String getNuevoComentario() {
        return nuevoComentario;
    }

    public void setNuevoComentario(String nuevoComentario) {
        this.nuevoComentario = nuevoComentario;
    }
/**
 *
 * @return me rederige a la pagina mostrarmultimedia
 * para comentar los archivos multimedia
 */
    public String doComentar() {
        Comentariomultimedia nuevo = new Comentariomultimedia();
        
        nuevo.setIdComentarioFoto(comentariomultimediaFacade.findPK());
        nuevo.setContenido(nuevoComentario);
        nuevo.setMultimedia(multimedia);
        nuevo.setUsuario(usuario);
        nuevo.setFecha(new Date());        
        comentariomultimediaFacade.create(nuevo);
        Usuario us;
        us=usuarioFacade.find(usuario.getIdUsuario());
        usuario=us;
        multimedia=(Multimedia)(usuario.getMultimediaCollection().toArray()[indice]);
        FacesContext con = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) con.getExternalContext().getSession(false);
        session.setAttribute("usuario", usuario);
        nuevoComentario="";
        return "mostrarMultimedia";
    }
   
    private String titulo;

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
   /**
    *
    * @return la lista de mostrar multimedia
    */
    public String doCambiarTitulo()
    {
        multimedia.setTitulo(titulo);
        multimediaFacade.edit(multimedia);
        usuario=usuarioFacade.find(usuario.getIdUsuario());
        FacesContext con = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) con.getExternalContext().getSession(false);
        session.setAttribute("usuario", usuario);
        return "mostrarMultimedia";
    }

    public String doSubir()
    {
        return "subirMultimedia";
    }
    public String doPublicar()
    {
        Publicacion publicacion= new Publicacion();
        String id = "1";
        List<String> lista = publicacionFacade.findPK();
        TreeSet<Integer> listaNumerica = new TreeSet<Integer>();
        for (String s : lista) {
            listaNumerica.add(Integer.parseInt(s));
        }
        int max = listaNumerica.last();
        if (listaNumerica != null) {
            int idInt = max + 1;
            id = String.valueOf(idInt);
        }
        publicacion.setIdPublicacion(id);
        publicacion.setFecha(new Date());
        if(multimedia.getTitulo()==null||multimedia.getTitulo().equals("")){
             publicacion.setTitulo("Sin titulo");
        }else{
            publicacion.setTitulo(multimedia.getTitulo());
        }
       
        publicacion.setContenido(null);
        publicacion.setUsuario(multimedia.getUsuario());
        publicacion.setUsuario1(multimedia.getUsuario());
        publicacion.setMultimedia(multimedia);
        publicacion.setTipo("multimedia");

        publicacionFacade.create(publicacion);
        return "mostrarMultimedia";
    }
}
